home *** CD-ROM | disk | FTP | other *** search
/ Aminet 8 / Aminet 8 (1995)(GTI - Schatztruhe)[!][Oct 1995].iso / Aminet / mus / play / tracker_4_31.lzh / tracker / Amiga / requester.c < prev    next >
C/C++ Source or Header  |  1995-02-14  |  3KB  |  132 lines

  1. /* requester.c 
  2.     vi:ts=3 sw=3:
  3.  */
  4.  
  5. /* $Id: requester.c,v 1.7 1995/02/14 16:51:22 espie Exp espie $
  6.  * $Log: requester.c,v $
  7.  * Revision 1.7  1995/02/14  16:51:22  espie
  8.  * *** empty log message ***
  9.  *
  10.  * Revision 1.6  1995/01/13  13:31:35  espie
  11.  * *** empty log message ***
  12.  *
  13.  * Revision 1.3  1994/01/09  04:49:18  Espie
  14.  * File requester !
  15.  */
  16.  
  17. #include <libraries/reqtools.h>
  18. #include <proto/reqtools.h>
  19. #include <proto/exec.h>
  20. #include <proto/dos.h>
  21. #include <dos/dos.h>
  22.  
  23. #include "defs.h"
  24. #include "extern.h"
  25. #include "amiga/amiga.h"
  26.  
  27. ID("$Id: requester.c,v 1.7 1995/02/14 16:51:22 espie Exp espie $")
  28. LOCAL void init_requester(void);
  29.  
  30. LOCAL struct ReqToolsBase *ReqToolsBase = 0;
  31.  
  32. LOCAL void (*INIT)(void) = init_requester;
  33.  
  34. LOCAL struct rtFileRequester *req = 0;
  35. LOCAL struct rtHandlerInfo *myhandler = 0;
  36.  
  37.  
  38.  
  39. LOCAL void close_requester()
  40.    {
  41.    if (myhandler)
  42.       rtReqHandler(myhandler, 0, RTRH_EndRequest, REQ_CANCEL, TAG_END);
  43.    if (req)
  44.       rtFreeRequest(req);
  45.    if (ReqToolsBase)
  46.       CloseLibrary(ReqToolsBase);
  47.    myhandler = 0;
  48.    req = 0;
  49.    ReqToolsBase = 0;
  50.    }
  51.  
  52. LOCAL void init_requester()
  53.    {
  54.    ReqToolsBase = OpenLibrary("reqtools.library", 38);
  55.    if (!ReqToolsBase)
  56.       {
  57.       requested_file(0);
  58.       return;
  59.       }
  60.    at_end(close_requester);
  61.    req = rtAllocRequestA(RT_FILEREQ, NULL);
  62.    }
  63.  
  64. LOCAL char fname[108];
  65.  
  66. void handle_requester(ULONG received)
  67.    {   
  68.    struct amiganame *new;
  69.    int total;
  70.    struct rtFileList *flist, *sweep;
  71.    struct MinList temp;
  72.    int result;
  73.  
  74.    if ( (result = rtReqHandler(myhandler, received, TAG_END)) == CALL_HANDLER)
  75.       return;
  76.    remove_req_handler();
  77.    myhandler = 0;
  78.    flist = (struct rtFileList *)result;
  79.  
  80.    if (flist)
  81.       {
  82.       NewList(&temp);      /* use temp as a `place holder' */
  83.       sweep = flist;
  84.       while(sweep)
  85.          {
  86.          total = strlen(req->Dir) + strlen(sweep->Name) + 2;
  87.          new = malloc(sizeof(struct amiganame) + total);
  88.          if (!new)
  89.             continue;
  90.          AddPart(strcpy(new->s, req->Dir), sweep->Name, total);
  91.          new->i = TRUE;
  92.          AddTail(&temp, new);
  93.          sweep = sweep->Next;
  94.          }
  95.       rtFreeFileList(flist);
  96.       
  97.       if (temp.mlh_TailPred != &temp)
  98.          {
  99.          /* unscrew the first element of temp out and loop the elements */
  100.  
  101.          new = temp.mlh_Head;
  102.          new->n.mln_Pred = temp.mlh_TailPred;
  103.          temp.mlh_TailPred->mln_Succ = new;
  104.    
  105.          requested_file(new);
  106.          }
  107.       else
  108.          requested_file(0);
  109.       }
  110.    else
  111.       requested_file(0);
  112.    }
  113.    
  114. void launch_requester()
  115.    {
  116.    INIT_ONCE;
  117.    
  118.    if (myhandler || !req)
  119.       return;
  120.    if (CALL_HANDLER != (int)rtFileRequest(req, fname, "Load song", 
  121.       RTFI_Flags, FREQF_MULTISELECT,
  122.       RT_ReqHandler, &myhandler, TAG_END))
  123.       {
  124.       myhandler = 0;
  125.       return;
  126.       }
  127.    install_req_handler(myhandler->WaitMask, handle_requester);
  128.    if (myhandler->DoNotWait)
  129.       handle_requester(0);
  130.    }
  131.  
  132.